//
//
//
//
//
// Parser.h
// 2011/08/29 @CieNET

#ifndef _TX_PARSER_H_
#define _TX_PARSER_H_

#include <string>
#include "common.h"
#include "Node.h"
#include "Exception.h"
#include "File.h"

namespace TinyXML
{
	class Parser
	{
		public:
			enum PARSE_STATE
			{
				NODE_INITIAL	= 0,
				NODE_START 		= 1,
				NODE_END		= 2,
				NODE_NAKED		= 3,
				NODE_ERROR		= 0xefffffff,
			};

			Parser();
			Parser(const std::string& fileName);
			~Parser();

			void Parse(const std::string& fileName);
			void Parse();

			// Node operations
			bool GetNodeContent(const std::string& name, std::string& content);
			Node* GetRoot(void);
			Node* FindFirstChildNode(Node* node, const std::string& name);

			// File operations
			void WriteToFile(const std::string& path);
			void WriteToFile(void);
			void WriteNode(File& file, U32& indent, Node* node);
		private:
			PARSE_STATE PraseSymbol(PARSE_STATE current, std::string& name, Properties& property);
			void InitialParser(const std::string& fileName);
			void ReadWord(const char* start, char*& ptr, const char* end, const std::string& symbol, std::string& name, bool& naked);
			bool IsAllBlank(char* start, const char* end);
			bool MoveToNextSym(const char* start, char*& ptr, const char* end, std::string& symbol /* OUT */);

			void DumpNode(Node* node);
			void DumpAll(void);
		private:
			Node* _root;
			Node* _current;
			PARSE_STATE _currentState;

			void* _mapAddr;
			U32 _line;
			File _file;
	};
};

#endif // _TX_PARSER_H_
